// 可变借用只有一个，不可变借用可以有多个
// 但是最后可变借用不用以后，可以被借用
struct Point { x: i32, y: i32 , z: i32 }

fn main() {
    let mut point = Point { x: 0, y: 0, z: 0 };

    // 多次不可变借用
    let borrowed_point = &point;
    let _another_borrowed_point = &point;

    // 从哪个读都可以，数据都一样，因为是不可变借用
    println!("borrowed_point has coordinates: ({}, {}, {})", borrowed_point.x, borrowed_point.y, borrowed_point.z);

    // 再次可变借用 , 就会报错, [有不可变借用的时候，不能进行可变借用]
    // let mutable_borrowed_point = &mut point;

    // 不可变借用，再次被用到， 所以上面的可变借用会报错
    // println!("again : mutable_borrowed_point has coordinates: ({}, {}, {})", mutable_borrowed_point.x, mutable_borrowed_point.y, mutable_borrowed_point.z);

    // 此后，不可变借用不再用了，可以被借用
    let mutable_borrow = &mut point;

    // 改变可变借用的值
    mutable_borrow.x = 5;
    mutable_borrow.y = 10;
    mutable_borrow.z = 15;

    // 报错，因为现在有不可变借用
    // let _y = &point.y;

    // 报错：因为println!() 执行不可变借用
    // println!("point Z coordinates: ({})",  point.z);

    // 没有问题, 可变借用可以被当作不可变借用来使用
    println!("mutable_borrowed_point has coordinates: ({}, {}, {})", mutable_borrow.x, mutable_borrow.y, mutable_borrow.z);

    // 因为可变借用不再用了，所以可以被借用
    let new_borrowed_point = &point;

    println!("new_borrowed_point has coordinates: ({}, {}, {})", new_borrowed_point.x, new_borrowed_point.y, new_borrowed_point.z);
}